#ifdef WIN32
#include <curses.h>
#else
#include <ncurses.h>
#endif
#include <assert.h>
#include <time.h>
#include "Jeu.h"

/**@brief Procedure ncursesAffiche:
<B>ncursesAffiche affiche le jeu actuel dans une window(fenetre),
c'est à dire le terrain avec les murs,les espace,le tank,les ennemis
 et le tir en mode texte(caractere)</B> */
void ncursesAffiche(WINDOW* win,const Jeu* jeu)
{
    int y,x,i,j,k,nbennemitotale,nbvie;
    const Tank* t=jeuGetTank(jeu);
    const Terrain* ter=jeuGetTerrain(jeu);
    const Tir* tir_tank=jeuGetConstTir(jeu);
    nbennemitotale=0;
    nbvie=tankGetVie(t);
    wclear(win);
    for(y=0;y<jeu->jeu_terrain.dimy;y++)
    {
        for(x=0;x<jeu->jeu_terrain.dimx;x++)
        {
            mvwprintw(win,y,x,"%c",terGetXY(ter,x,y));
        }
    }
    if(jeu->jeu_bonus==1)
	{
        mvwprintw(win,jeuGetOrdonneeBonus(jeu),jeuGetAbscisseBonus(jeu),"+");
	}
	if(jeu->jeu_cle==1)
	{
        mvwprintw(win,jeuGetOrdonneeCle(jeu),jeuGetAbscisseCle(jeu),"c");
	}
    for(j=ter->dimy-4;j<ter->dimy;j++)
	{
        for(k=ter->dimx;k<ter->dimx+3;k++)
        {
           if(nbvie==0)
           {
                break;
           }
           else
           {
                mvwprintw(win,j,k,"v");
                nbvie--;
           }
        }
	}
    for(i=0;i<jeu->jeu_nbennemi;i++)
    {
        if(terGetXY(&jeu->jeu_terrain,enemGetX(&jeu->jeu_tabennemi.ad[i]),enemGetY(&jeu->jeu_tabennemi.ad[i]))!='V')
        {
            mvwprintw(win,enemGetY(&jeu->jeu_tabennemi.ad[i]),enemGetX(&jeu->jeu_tabennemi.ad[i]),"e");
        }
    }
    for(j=0;j<jeu->jeu_nbtirennemi;j++)
    {
        mvwprintw(win,jeu->jeu_tabtirennemi.ad[j].tir_y,jeu->jeu_tabtirennemi.ad[j].tir_x,".");
    }
    if(jeu->jeu_tank.tank_projectile==1)
    {
        mvwprintw(win,tirGetY(tir_tank),tirGetX(tir_tank),".");
    }
    /* affichage du nombre d'ennemi totale restant a droite de l'ecran */
    for(j=0;j<7;j++)
	{
        for(k=ter->dimx;k<ter->dimx+3;k++)
        {
            if(nbennemitotale>jeu->jeu_nbennemitotale)
            {
                break;
            }
            else if(jeu->jeu_nbennemitotale>0)
            {
                mvwprintw(win,j,k,"e");
                nbennemitotale++;
            }
        }
	}
	/*affichage du nombre de vie restant a droite de l'ecran */
	 if(terGetXY(&jeu->jeu_terrain,tankGetX(&jeu->jeu_tank),tankGetY(&jeu->jeu_tank))!='V')
     {
        mvwprintw(win,tankGetY(t),tankGetX(t),"*");
     }
    wmove(win,tankGetY(t),tankGetX(t));
    mvwprintw(win,terGetDimy(ter),0,"%s","battle_city_tank");
}

void ncursesBoucle(Jeu* jeu)
{
    WINDOW *win,*screan;
    int c,continue_boucle,tmp,i,vie,score;
    int niv=jeuGetNiveau(jeu);
    /** horloge en seconde */
    float horloge_courante,horloge_precedente;

     /** Intervalle de temps (en secondes) entre deux évolutions du jeu */
    /** Changer la valeur pour ralentir ou accélérer le déplacement des tanks ennemis*/
    float intervalle_horloge = 0.1f;

    screan = initscr();		/** passe l'écran texte en mode NCurses */
	clear();		/** efface l'écran */
	noecho();  	/** Lorsqu'une touche est préssée au clavier, elle n'apparait pas à l'écran */
	cbreak();		/** un caractère est directement affiché, il ne passe pas dans un buffer */

    /** Creation d'une nouvelle fenetre en mode texte */
	/** => fenetre de dimension et position ( WIDTH, HEIGHT, STARTX,STARTY) */
	win=newwin(terGetDimy(&jeu->jeu_terrain)+1,terGetDimx(&jeu->jeu_terrain)+3,10,5);
    keypad(win, TRUE);/** pour que les flèches soient traitées (il faut le faire après création de la fenêtre) */
	nodelay(win,true); /** Pour que l'appel à wgetch soit non-bloquant */
	continue_boucle=1;

	/** Récupère l'horloge actuelle et la convertit en secondes */
    /** clock() retourne le nombre de tops horloge depuis le lancement du programme */
    horloge_precedente = (float)clock()/(float)CLOCKS_PER_SEC;

    i=rand()%5;
    jeu->jeu_xbonus=i+1+rand()%jeu->jeu_terrain.dimx/2;
	jeu->jeu_ybonus=i+2+rand()%jeu->jeu_terrain.dimy/2;
	jeu->jeu_xcle=i+1+rand()%jeu->jeu_terrain.dimx;
	jeu->jeu_ycle=i+1+rand()%jeu->jeu_terrain.dimy;
    ncursesAffiche(win,jeu);

    do
	{
        /** Récupère l'horloge actuelle et la convertit en secondes */
        /** clock() retourne le nombre de tops horloge depuis le lancement du programme */
        horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;

        if (horloge_courante-horloge_precedente>=intervalle_horloge)
        {
            tmp=tankGetTemp(&jeu->jeu_tank);
            tmp=-tmp;
            tankSetTemp(&jeu->jeu_tank,tmp);
            jeuEvolue(jeu);
            ncursesAffiche( win, jeu);
            horloge_precedente = horloge_courante;
        }


		c = wgetch(win);
		switch(c)
		{
			case KEY_LEFT:
				jeuActionClavier(jeu, 'g');
				ncursesAffiche( win, jeu);
				break;
			case KEY_RIGHT:
				jeuActionClavier( jeu, 'd');
				ncursesAffiche( win, jeu);
				break;
			case KEY_UP:
				jeuActionClavier(jeu, 'h');
				ncursesAffiche( win, jeu);
				break;
			case KEY_DOWN:
				jeuActionClavier(jeu, 'b');
				ncursesAffiche(win, jeu);
				break;
			case 'x':
                jeuActionClavier(jeu,'x');
                ncursesAffiche(win,jeu);
                break;
			case 27: /* ECHAP */
				continue_boucle = 0;
				break;
		}
		if(jeu->jeu_nbennemi==0)
		{
            vie=tankGetVie(&jeu->jeu_tank);
            vie=vie+1;
            score=jeuGetScore(jeu);
            niv++;
            jeuInit(jeu,niv);
            jeu->jeu_tank.tank_vie=vie;
            jeu->jeu_score=score;
		}
		if(jeu->jeu_tank.tank_vie==0)
		{
            continue_boucle=0;
		}
	} while (continue_boucle==1);
	assert(delwin(win)!=ERR);
    assert(delwin(screan)!=ERR);

	endwin();

}
